/**
 * 提示词模板管理 - IntelliMark适配版
 * 从ai-writer-lite项目迁移并针对Markdown编辑器优化
 */

import { PromptTemplate } from "@langchain/core/prompts";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { SystemMessagePromptTemplate } from "@langchain/core/prompts";
import { HumanMessagePromptTemplate } from "@langchain/core/prompts";

// 提示词模板类型
export type PromptCategory =
  | 'agent'
  | 'tools'
  | 'memory'
  | 'analysis'
  | 'generation'
  | 'markdown'
  | 'research';

// 提示词模板配置
export interface PromptTemplateConfig {
  id: string;
  name: string;
  category: PromptCategory;
  template: string;
  variables: string[];
  description?: string;
  examples?: string[];
  version?: string;
}

// 系统提示词模板 - 适配IntelliMark
export const SYSTEM_PROMPTS: Record<string, PromptTemplateConfig> = {
  // IntelliMark专用助手
  'intellimark-assistant': {
    id: 'intellimark-assistant',
    name: 'IntelliMark AI Assistant',
    category: 'agent',
    template: `你是一位专业的IntelliMark AI写作助手，专门帮助用户进行Markdown文档的编辑、优化和创作。你拥有丰富的技术写作、学术写作和创意写作经验。

## 核心能力
1. **Markdown优化**: 改进文档结构、格式和可读性
2. **内容创作**: 生成高质量的文本内容
3. **文本编辑**: 提供润色、扩写、缩写、改写等服务
4. **文档分析**: 深度分析文档结构、风格和内容质量
5. **技术写作**: 擅长技术文档、API文档、教程等
6. **学术写作**: 支持论文、报告、学术文章的写作和优化

## 工作原则
- 始终保持专业、准确、 helpful的态度
- 尊重用户的写作意图和风格偏好
- 提供具体、可操作的改进建议
- 确保Markdown格式的正确性和一致性
- 注重内容的逻辑性和可读性

## 当前上下文
{context}

## 文档信息
{document_info}

请根据用户的需求协助完成Markdown文档的编辑和优化任务。`,
    variables: ['context', 'document_info'],
    description: 'IntelliMark主要助手系统提示词',
    version: '1.0.0',
  },

  'text-analyzer': {
    id: 'text-analyzer',
    name: 'Text Analyzer System',
    category: 'analysis',
    template: `你是一位专业的文本分析师，拥有深厚的文学功底和语言学知识。你的任务是全面分析Markdown文本的各个维度，为用户提供深入的洞察和改进建议。

## 分析维度
1. **内容质量**: 分析信息的准确性、完整性和价值性
2. **结构分析**: 评估文档结构、段落组织、标题层级
3. **语言风格**: 分析语体、语调、修辞手法和表达方式
4. **可读性**: 计算阅读难度、句子复杂度、词汇丰富度
5. **Markdown格式**: 检查格式规范、链接有效性、语法正确性
6. **SEO优化**: 分析关键词密度、标题优化、元数据

## 分析方法
- 采用定量与定性相结合的方法
- 提供数据支撑的具体分析
- 给出实用的改进建议
- 对比分析不同版本的优劣

## 输出格式
请以结构化的方式呈现分析结果，包括：
- 总体评价和评分
- 详细分析（分维度）
- 具体改进建议
- Markdown格式优化建议`,
    variables: [],
    description: 'IntelliMark文本分析专用提示词',
    version: '1.0.0',
  },

  'markdown-generator': {
    id: 'markdown-generator',
    name: 'Markdown Content Generator',
    category: 'generation',
    template: `你是一位专业的Markdown内容生成专家，擅长创建各种类型的高质量Markdown文档。你拥有丰富的技术写作、学术写作和创意写作经验。

## Markdown专长
1. **语法掌握**: 熟练运用所有Markdown语法特性
2. **结构设计**: 设计清晰的文档层次和逻辑结构
3. **格式优化**: 确保格式的一致性和美观性
4. **内容组织**: 合理安排段落、列表、表格等元素
5. **多媒体集成**: 妥善处理图片、链接、代码块等

## 创作原则
1. **格式规范**: 严格遵循Markdown语法规范
2. **结构清晰**: 使用合理的标题层级和段落组织
3. **内容准确**: 确保信息的准确性和权威性
4. **可读性强**: 注重阅读体验和视觉效果
5. **兼容性好**: 确保在不同平台的渲染效果

## 技术要素
- 合理使用标题层级 (# ## ### ####)
- 善用列表和表格组织信息
- 正确插入和处理链接和图片
- 规范使用代码块和行内代码
- 注意引用和分隔符的使用

请开始创建专业的Markdown内容！`,
    variables: [],
    description: 'Markdown内容生成专用提示词',
    version: '1.0.0',
  },
};

// 工具提示词模板
export const TOOL_PROMPTS: Record<string, PromptTemplateConfig> = {
  'text-polish': {
    id: 'text-polish',
    name: 'Text Polish Tool',
    category: 'tools',
    template: `请对以下Markdown文本进行润色优化，提升其表达质量和可读性。

## 原文
\`\`\`markdown
{text}
\`\`\`

## 润色要求
- 保持原意不变，确保信息准确性
- 提升语言表达的准确性和流畅性
- 优化句子结构和段落组织
- 修正语法错误和不当用词
- 保持Markdown格式的正确性
- 增强文本的专业性和可读性

## 输出格式
请直接输出润色后的Markdown文本，确保格式正确。`,
    variables: ['text'],
    description: 'Markdown文本润色工具提示词',
  },

  'text-expand': {
    id: 'text-expand',
    name: 'Text Expand Tool',
    category: 'tools',
    template: `请对以下Markdown文本进行扩写，增加更多细节和内容。

## 原文
\`\`\`markdown
{text}
\`\`\`

## 扩写要求
- 保持原文的核心内容和Markdown格式
- 添加具体的描述、例子或解释
- 丰富内容深度和信息量
- 增加相关的背景信息
- 确保扩写内容逻辑连贯
- 保持格式的一致性

## 扩写方向
{expansion_direction}

## 目标长度
约 {target_length} 字

请输出扩写后的完整Markdown文本。`,
    variables: ['text', 'expansion_direction', 'target_length'],
    description: 'Markdown文本扩写工具提示词',
  },

  'content-continue': {
    id: 'content-continue',
    name: 'Content Continue Tool',
    category: 'tools',
    template: `请根据已有Markdown内容继续写作，保持风格和格式的一致性。

## 已有内容
\`\`\`markdown
{existing_content}
\`\`\`

## 续写要求
- 保持与已有内容的风格一致
- 延续当前的逻辑发展
- 保持Markdown格式的正确性
- 确保内容的连贯性和完整性
- 维持标题层级的合理性

## 上下文信息
{context}

## 续写长度
约 {target_length} 字

请输出续写的Markdown内容。`,
    variables: ['existing_content', 'context', 'target_length'],
    description: 'Markdown内容续写工具提示词',
  },

  'text-summarize': {
    id: 'text-summarize',
    name: 'Text Summarize Tool',
    category: 'tools',
    template: `请为以下Markdown文本生成简洁准确的摘要。

## 原文
\`\`\`markdown
{text}
\`\`\`

## 摘要要求
- 概括文本的主要内容和观点
- 保留关键信息和重要细节
- 语言简洁明了，逻辑清晰
- 摘要长度控制在 {target_length} 字以内
- 确保摘要的准确性和完整性
- 可以保留基本的Markdown格式

## 摘要类型
{summary_type}

请生成摘要。`,
    variables: ['text', 'target_length', 'summary_type'],
    description: 'Markdown文本摘要工具提示词',
  },

  'markdown-format': {
    id: 'markdown-format',
    name: 'Markdown Format Tool',
    category: 'markdown',
    template: `请检查并优化以下Markdown文本的格式。

## 原文
\`\`\`markdown
{text}
\`\`\`

## 格式检查要点
1. **标题层级**: 检查标题层级的正确性和连续性
2. **列表格式**: 确保有序列表和无序列表的格式正确
3. **链接处理**: 检查链接语法和有效性
4. **图片语法**: 确保图片语法的正确性
5. **代码块**: 检查代码块和行内代码的格式
6. **表格格式**: 确保表格语法的正确性
7. **引用格式**: 检查引用语法的使用
8. **特殊字符**: 处理需要转义的特殊字符

## 优化要求
- 修正格式错误
- 统一格式风格
- 提升可读性
- 保持内容不变

请输出格式优化后的Markdown文本。`,
    variables: ['text'],
    description: 'Markdown格式优化工具提示词',
  },

  'style-analysis': {
    id: 'style-analysis',
    name: 'Style Analysis Tool',
    category: 'analysis',
    template: `请分析以下Markdown文本的写作风格特点。

## 分析文本
\`\`\`markdown
{text}
\`\`\`

## 分析维度
1. **语言特征**: 词汇选择、句式结构、修辞手法
2. **语体语调**: 正式/非正式、客观/主观、理性/感性
3. **写作风格**: 技术/学术/创意/新闻等风格类型
4. **可读性**: 句子长度、段落长度、词汇难度
5. **Markdown使用**: 格式运用熟练度和规范性
6. **目标读者**: 适合的读者群体和场景

## 输出要求
- 提供具体的分析依据
- 给出风格特征总结
- 提出改进建议
- 评分（1-10分）

请生成详细的分析报告。`,
    variables: ['text'],
    description: 'Markdown文本风格分析工具提示词',
  },

  'content-outline': {
    id: 'content-outline',
    name: 'Content Outline Tool',
    category: 'tools',
    template: `请根据主题生成详细的Markdown文档大纲。

## 主题
{topic}

## 大纲要求
- 结构清晰，层次分明
- 逻辑性强，内容完整
- 符合Markdown文档规范
- 包含主要章节和子章节
- 提供每部分的简要说明

## 文档类型
{document_type}

## 目标读者
{target_audience}

## 输出格式
请使用Markdown格式输出大纲，包含：
- 一级标题 (#)
- 二级标题 (##)
- 三级标题 (###)
- 每个部分的简要说明

请生成详细大纲。`,
    variables: ['topic', 'document_type', 'target_audience'],
    description: 'Markdown文档大纲生成工具提示词',
  },

  'keyword-extraction': {
    id: 'keyword-extraction',
    name: 'Keyword Extraction Tool',
    category: 'analysis',
    template: `请从以下Markdown文本中提取关键词和核心概念。

## 原文
\`\`\`markdown
{text}
\`\`\`

## 提取要求
1. **核心关键词**: 提取5-10个最重要的关键词
2. **技术术语**: 识别专业术语和技术名词
3. **主题概念**: 提取主要的概念和主题
4. **权重分析**: 分析关键词的重要性权重
5. **分类整理**: 按类别整理关键词

## 输出格式
- 核心关键词列表（按重要性排序）
- 技术术语列表
- 主题概念列表
- 关键词权重分析

请提取并分析关键词。`,
    variables: ['text'],
    description: 'Markdown关键词提取工具提示词',
  },
};

// 提示词模板管理器
export class PromptTemplateManager {
  private static instance: PromptTemplateManager;
  private templates: Map<string, PromptTemplateConfig> = new Map();
  private compiledTemplates: Map<string, PromptTemplate | ChatPromptTemplate> = new Map();

  private constructor() {
    this.initializeTemplates();
  }

  public static getInstance(): PromptTemplateManager {
    if (!PromptTemplateManager.instance) {
      PromptTemplateManager.instance = new PromptTemplateManager();
    }
    return PromptTemplateManager.instance;
  }

  private initializeTemplates(): void {
    // 注册系统提示词
    Object.entries(SYSTEM_PROMPTS).forEach(([key, config]) => {
      this.templates.set(key, config);
    });

    // 注册工具提示词
    Object.entries(TOOL_PROMPTS).forEach(([key, config]) => {
      this.templates.set(key, config);
    });

    console.log(`Initialized ${this.templates.size} prompt templates`);
  }

  // 获取模板配置
  public getTemplate(id: string): PromptTemplateConfig | undefined {
    return this.templates.get(id);
  }

  // 获取所有模板
  public getAllTemplates(): Record<string, PromptTemplateConfig> {
    const result: Record<string, PromptTemplateConfig> = {};
    this.templates.forEach((config, id) => {
      result[id] = config;
    });
    return result;
  }

  // 按类别获取模板
  public getTemplatesByCategory(category: PromptCategory): Record<string, PromptTemplateConfig> {
    const result: Record<string, PromptTemplateConfig> = {};
    this.templates.forEach((config, id) => {
      if (config.category === category) {
        result[id] = config;
      }
    });
    return result;
  }

  // 编译模板
  public compileTemplate(id: string): PromptTemplate | ChatPromptTemplate | undefined {
    // 检查缓存
    if (this.compiledTemplates.has(id)) {
      return this.compiledTemplates.get(id);
    }

    const config = this.getTemplate(id);
    if (!config) {
      return undefined;
    }

    let compiledTemplate: PromptTemplate | ChatPromptTemplate;

    try {
      if (config.category === 'agent') {
        // Agent提示词使用ChatPromptTemplate
        compiledTemplate = ChatPromptTemplate.fromMessages([
          SystemMessagePromptTemplate.fromTemplate(config.template),
        ]);
      } else {
        // 工具提示词使用PromptTemplate
        compiledTemplate = PromptTemplate.fromTemplate(config.template);
      }

      // 缓存编译结果
      this.compiledTemplates.set(id, compiledTemplate);
      return compiledTemplate;
    } catch (error) {
      console.error(`Failed to compile template ${id}:`, error);
      return undefined;
    }
  }

  // 格式化提示词
  public formatPrompt(id: string, variables: Record<string, any>): string | undefined {
    const template = this.compileTemplate(id);
    if (!template) {
      return undefined;
    }

    try {
      return template.format(variables);
    } catch (error) {
      console.error(`Failed to format prompt ${id}:`, error);
      return undefined;
    }
  }

  // 添加自定义模板
  public addTemplate(config: PromptTemplateConfig): void {
    this.templates.set(config.id, config);
    // 清除编译缓存
    this.compiledTemplates.delete(config.id);
    console.log(`Added custom template: ${config.id}`);
  }

  // 更新模板
  public updateTemplate(id: string, updates: Partial<PromptTemplateConfig>): boolean {
    const existing = this.templates.get(id);
    if (!existing) {
      return false;
    }

    const updated = { ...existing, ...updates };
    this.templates.set(id, updated);
    // 清除编译缓存
    this.compiledTemplates.delete(id);
    console.log(`Updated template: ${id}`);
    return true;
  }

  // 删除模板
  public removeTemplate(id: string): boolean {
    const deleted = this.templates.delete(id);
    if (deleted) {
      // 清除编译缓存
      this.compiledTemplates.delete(id);
      console.log(`Removed template: ${id}`);
    }
    return deleted;
  }

  // 验证模板变量
  public validateTemplateVariables(id: string, variables: Record<string, any>): {
    isValid: boolean;
    missing: string[];
    extra: string[];
  } {
    const config = this.getTemplate(id);
    if (!config) {
      return { isValid: false, missing: [], extra: [] };
    }

    const required = config.variables;
    const provided = Object.keys(variables);
    const missing = required.filter(v => !provided.includes(v));
    const extra = provided.filter(v => !required.includes(v));

    return {
      isValid: missing.length === 0,
      missing,
      extra,
    };
  }

  // 搜索模板
  public searchTemplates(query: string): Record<string, PromptTemplateConfig> {
    const results: Record<string, PromptTemplateConfig> = {};
    const lowerQuery = query.toLowerCase();

    this.templates.forEach((config, id) => {
      const searchableText = [
        config.id,
        config.name,
        config.description,
        config.category,
      ].join(' ').toLowerCase();

      if (searchableText.includes(lowerQuery)) {
        results[id] = config;
      }
    });

    return results;
  }

  // 获取模板统计
  public getStatistics(): Record<string, any> {
    const stats = {
      totalTemplates: this.templates.size,
      compiledTemplates: this.compiledTemplates.size,
      categories: {} as Record<string, number>,
    };

    this.templates.forEach(config => {
      stats.categories[config.category] = (stats.categories[config.category] || 0) + 1;
    });

    return stats;
  }
}

// 导出便捷函数
export const getPromptTemplateManager = (): PromptTemplateManager => {
  return PromptTemplateManager.getInstance();
};

export const getPromptTemplate = (id: string): PromptTemplateConfig | undefined => {
  return getPromptTemplateManager().getTemplate(id);
};

export const formatPrompt = (id: string, variables: Record<string, any>): string | undefined => {
  return getPromptTemplateManager().formatPrompt(id, variables);
};

// 导出默认模板
export { SYSTEM_PROMPTS, TOOL_PROMPTS };